From 0cc9a99e560a2f52bcf052fd85b1efae35ee812f Mon Sep 17 00:00:00 2001
From: Sylvain Gault <sylvain.gault@gmail.com>
Date: Tue, 29 Sep 2015 04:45:09 +0200
Subject: [PATCH 1/1] bios: Don't try to guess the sections alignment

For the compression / decompression to succeed, the sections layout must
be the same between the virtual memory and load memory. The section
alignment was kept in sync by introducing aligment that should be
greater or equal to the actual section alignment.

This patch compute the load memory addresses of the sections so that
the layout is the same as the virtual memory addresses.

Signed-off-by: Sylvain Gault <sylvain.gault@gmail.com>
Tested-by: poma <pomidorabelisima@gmail.com>
Signed-off-by: Paulo Alcantara <pcacjr@zytor.com>
---
 core/i386/syslinux.ld   | 63 ++++++++++---------------------------------------
 core/x86_64/syslinux.ld | 63 ++++++++++---------------------------------------
 2 files changed, 24 insertions(+), 102 deletions(-)

diff --git a/core/i386/syslinux.ld b/core/i386/syslinux.ld
index 7390451..92b75b1 100644
--- a/core/i386/syslinux.ld
+++ b/core/i386/syslinux.ld
@@ -255,10 +255,9 @@ SECTIONS
 	. = 0x100000;
 
 	__pm_code_start = .;
+	__vma_to_lma = __pm_code_lma - __pm_code_start;
 
-	__text_vma = .;
-	__text_lma = __pm_code_lma;
-	.text : AT(__text_lma) {
+	.text : AT(ADDR(.text) + __vma_to_lma) {
 		FILL(0x90909090)
 		__text_start = .;
 		*(.text)
@@ -266,106 +265,68 @@ SECTIONS
 		__text_end = .;
 	}
 
-	. = ALIGN(32);
-
-	__rodata_vma = .;
-	__rodata_lma = __rodata_vma + __text_lma - __text_vma;
-	.rodata : AT(__rodata_lma) {
+	.rodata : AT(ADDR(.rodata) + __vma_to_lma) {
 		__rodata_start = .;
 		*(.rodata)
 		*(.rodata.*)
 		__rodata_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__ctors_vma = .;
-	__ctors_lma = __ctors_vma + __text_lma - __text_vma;
-	.ctors : AT(__ctors_lma) {
+	.ctors : AT(ADDR(.ctors) + __vma_to_lma) {
 		__ctors_start = .;
 		KEEP (*(SORT(.ctors.*)))
 		KEEP (*(.ctors))
 		__ctors_end = .;
 	}
 
-	__dtors_vma = .;
-	__dtors_lma = __dtors_vma + __text_lma - __text_vma;
-	.dtors : AT(__dtors_lma) {
+	.dtors : AT(ADDR(.dtors) + __vma_to_lma) {
 		__dtors_start = .;
 		KEEP (*(SORT(.dtors.*)))
 		KEEP (*(.dtors))
 		__dtors_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__dynsym_vma = .;
-	__dynsym_lma = __dynsym_vma + __text_lma - __text_vma;
-	.dynsym : AT(__dynsym_lma) {
+	.dynsym : AT(ADDR(.dynsym) + __vma_to_lma) {
 		__dynsym_start = .;
 		*(.dynsym)
 		__dynsym_end = .;
 	}
 	__dynsym_len = __dynsym_end - __dynsym_start;
 
-	. = ALIGN(4);
-
-	__dynstr_vma = .;
-	__dynstr_lma = __dynstr_vma + __text_lma - __text_vma;
-	.dynstr : AT(__dynstr_lma) {
+	.dynstr : AT(ADDR(.dynstr) + __vma_to_lma) {
 		__dynstr_start = .;
 		*(.dynstr)
 		__dynstr_end = .;
 	}
 	__dynstr_len = __dynstr_end - __dynstr_start;
 
-	. = ALIGN(4);
-
-	__gnu_hash_vma = .;
-	__gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma;
-	.gnu.hash : AT(__gnu_hash_lma) {
+	.gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) {
 		__gnu_hash_start = .;
 		*(.gnu.hash)
 		__gnu_hash_end = .;
 	}
 
 
-	. = ALIGN(4);
-
-	__dynlink_vma = .;
-	__dynlink_lma = __dynlink_vma + __text_lma - __text_vma;
-	.dynlink : AT(__dynlink_lma) {
+	.dynlink : AT(ADDR(.dynlink) + __vma_to_lma) {
 		__dynlink_start = .;
 		*(.dynlink)
 		__dynlink_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__got_vma = .;
-	__got_lma = __got_vma + __text_lma - __text_vma;
-	.got : AT(__got_lma) {
+	.got : AT(ADDR(.got) + __vma_to_lma) {
 		__got_start = .;
 		KEEP (*(.got.plt))
 		KEEP (*(.got))
 		__got_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__dynamic_vma = .;
-	__dynamic_lma = __dynamic_vma + __text_lma - __text_vma;
-	.dynamic : AT(__dynamic_lma) {
+	.dynamic : AT(ADDR(.dynamic) + __vma_to_lma) {
 		__dynamic_start = .;
 		*(.dynamic)
 		__dynamic_end = .;
 	}
 
-	. = ALIGN(32);
-
-	__data_vma = .;
-	__data_lma = __data_vma + __text_lma - __text_vma;
-	.data : AT(__data_lma) {
+	.data : AT(ADDR(.data) + __vma_to_lma) {
 		__data_start = .;
 		*(.data)
 		*(.data.*)
diff --git a/core/x86_64/syslinux.ld b/core/x86_64/syslinux.ld
index bf815c4..70c6e00 100644
--- a/core/x86_64/syslinux.ld
+++ b/core/x86_64/syslinux.ld
@@ -255,10 +255,9 @@ SECTIONS
 	. = 0x100000;
 
 	__pm_code_start = .;
+	__vma_to_lma = __pm_code_lma - __pm_code_start;
 
-	__text_vma = .;
-	__text_lma = __pm_code_lma;
-	.text : AT(__text_lma) {
+	.text : AT(ADDR(.text) + __vma_to_lma) {
 		FILL(0x90909090)
 		__text_start = .;
 		*(.text)
@@ -266,106 +265,68 @@ SECTIONS
 		__text_end = .;
 	}
 
-	. = ALIGN(32);
-
-	__rodata_vma = .;
-	__rodata_lma = __rodata_vma + __text_lma - __text_vma;
-	.rodata : AT(__rodata_lma) {
+	.rodata : AT(ADDR(.rodata) + __vma_to_lma) {
 		__rodata_start = .;
 		*(.rodata)
 		*(.rodata.*)
 		__rodata_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__ctors_vma = .;
-	__ctors_lma = __ctors_vma + __text_lma - __text_vma;
-	.ctors : AT(__ctors_lma) {
+	.ctors : AT(ADDR(.ctors) + __vma_to_lma) {
 		__ctors_start = .;
 		KEEP (*(SORT(.ctors.*)))
 		KEEP (*(.ctors))
 		__ctors_end = .;
 	}
 
-	__dtors_vma = .;
-	__dtors_lma = __dtors_vma + __text_lma - __text_vma;
-	.dtors : AT(__dtors_lma) {
+	.dtors : AT(ADDR(.dtors) + __vma_to_lma) {
 		__dtors_start = .;
 		KEEP (*(SORT(.dtors.*)))
 		KEEP (*(.dtors))
 		__dtors_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__dynsym_vma = .;
-	__dynsym_lma = __dynsym_vma + __text_lma - __text_vma;
-	.dynsym : AT(__dynsym_lma) {
+	.dynsym : AT(ADDR(.dynsym) + __vma_to_lma) {
 		__dynsym_start = .;
 		*(.dynsym)
 		__dynsym_end = .;
 	}
 	__dynsym_len = __dynsym_end - __dynsym_start;
 
-	. = ALIGN(4);
-
-	__dynstr_vma = .;
-	__dynstr_lma = __dynstr_vma + __text_lma - __text_vma;
-	.dynstr : AT(__dynstr_lma) {
+	.dynstr : AT(ADDR(.dynstr) + __vma_to_lma) {
 		__dynstr_start = .;
 		*(.dynstr)
 		__dynstr_end = .;
 	}
 	__dynstr_len = __dynstr_end - __dynstr_start;
 
-	. = ALIGN(4);
-
-	__gnu_hash_vma = .;
-	__gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma;
-	.gnu.hash : AT(__gnu_hash_lma) {
+	.gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) {
 		__gnu_hash_start = .;
 		*(.gnu.hash)
 		__gnu_hash_end = .;
 	}
 
 
-	. = ALIGN(4);
-
-	__dynlink_vma = .;
-	__dynlink_lma = __dynlink_vma + __text_lma - __text_vma;
-	.dynlink : AT(__dynlink_lma) {
+	.dynlink : AT(ADDR(.dynlink) + __vma_to_lma) {
 		__dynlink_start = .;
 		*(.dynlink)
 		__dynlink_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__got_vma = .;
-	__got_lma = __got_vma + __text_lma - __text_vma;
-	.got : AT(__got_lma) {
+	.got : AT(ADDR(.got) + __vma_to_lma) {
 		__got_start = .;
 		KEEP (*(.got.plt))
 		KEEP (*(.got))
 		__got_end = .;
 	}
 
-	. = ALIGN(4);
-
-	__dynamic_vma = .;
-	__dynamic_lma = __dynamic_vma + __text_lma - __text_vma;
-	.dynamic : AT(__dynamic_lma) {
+	.dynamic : AT(ADDR(.dynamic) + __vma_to_lma) {
 		__dynamic_start = .;
 		*(.dynamic)
 		__dynamic_end = .;
 	}
 
-	. = ALIGN(32);
-
-	__data_vma = .;
-	__data_lma = __data_vma + __text_lma - __text_vma;
-	.data : AT(__data_lma) {
+	.data : AT(ADDR(.data) + __vma_to_lma) {
 		__data_start = .;
 		*(.data)
 		*(.data.*)
-- 
2.5.5.GIT

